home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 28
/
Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso
/
Aminet
/
dev
/
misc
/
gms_joyports.lha
/
JoyPorts
/
joyports.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-10-10
|
8KB
|
217 lines
/*
** Module: JoyPorts.
** Type: Object based hardware driver.
** Author: Paul Manias
** Copyright: DreamWorld Productions (c) 1996-1998. All rights reserved.
**
** --------------------------------------------------------------------------
**
** TERMS AND CONDITIONS
**
** This source code is made available on the condition that it is only used to
** further enhance the Games Master System. IT IS NOT DISTRIBUTED FOR THE USE
** IN OTHER PRODUCTS. Developers may edit and re-release this source code
** only in the form of its GMS module. Use of this code outside of the module
** is not permitted under any circumstances.
**
** This source code stays the copyright of DreamWorld Productions regardless
** of what changes or additions are made to it by 3rd parties. However joint
** copyright is granted if the 3rd party wishes to retain some ownership of
** said modifications.
**
** In exchange for our distribution of this source code, we also ask you to
** distribute the source when releasing a modified version of this module.
** This is not compulsory if any additions are sensitive to 3rd party
** copyrights, or if it would damage any commercial product(s).
**
** --------------------------------------------------------------------------
**
** BUGS AND MISSING FEATURES
** -------------------------
** If you correct a bug or fill in a missing feature, the source should be
** e-mailed to pmanias@ihug.co.nz for inclusion in the next update of this
** module.
**
** The following issues need attention:
**
** + Joypad, Segapad and Analogue support. There used to be full joypad and
** sega support but it was never confirmed that it worked, so it was removed.
**
** + The hardware bits for some of the mouse/joystick buttons are not set
** correctly, these need to be fixed and tested.
**
** + Support a Qualifier mask for keyboard based emulation. This will allow
** the player to select between normal keyboard input and joystick input (vital
** for mouse based games that support the keyboard). Also, support a
** switching feature, so that the user can flip between modes at the press of
** a key.
**
** + Grab joydata timeouts from user prefs rather than using the default.
**
** + Buttons need to be buffered so that there is a point to the time-out field.
** The time since the last Activate()/Query() should also be stored in the
** JoyData structure so that we can assess when the last read was.
**
** + If it is necessary to calibrate analog joysticks (find the most extreme
** value that can be returned for each direction) we will need to do this
** from GMSPrefs.
**
** CHANGES
** -------
** 12 Jan Added new fields - ButtonTimeOut, MoveTimeOut.
** 21 Jan Bug in Joystick reader not resetting coordinates to null, fixed.
** 22 Jan New fields added, *Limit.
** 06 Feb Added support for GVBase->UserFocus. [Activate() altered]
** 14 Feb Altered port initialisation.
** Keyboard emulation support is working.
** 26 Apr Now written entirely in C.
** 14 Jun Removed the "DATA=faronly" option from SAS/C and recompiled - looks okay.
** Tested the DCC compilation, worked fine.
** 10 Oct Added support for JPORT_DIGITAL and JPORT_ANALOGUE in Port field.
*/
#include <proto/dpkernel.h>
#include <system/all.h>
#include <input/keyboard.h>
#include <hardware/custom.h>
#include <hardware/cia.h>
#include <dpkernel/prefs.h>
extern struct SysObject *JoyObject;
extern struct GVBase *GVBase;
extern struct Custom *custom;
extern struct CIA *cia;
extern struct ModPublic *Public;
/************************************************************************************
** Internal proto-types.
*/
void FreeModule(void);
void ReadAnalogue(struct JoyData *);
void ReadJoyPad(struct JoyData *);
void ReadJoyStick(struct JoyData *);
void ReadKeyboard(struct JoyData *);
void ReadMouse(struct JoyData *);
void ReadSegaPad(struct JoyData *);
LIBFUNC LONG JOY_Activate(mreg(__a0) struct JoyData *);
LIBFUNC struct JoyData * JOY_Get(mreg(__a0) struct Stats *);
LIBFUNC LONG JOY_Init(mreg(__a0) struct JoyData *);
LIBFUNC void JOY_Free(mreg(__a0) struct JoyData *);
#define JOY_FIELDS 11
struct Field JoyFields[JOY_FIELDS] = {
{ "Port", 12, FID_Port, FDF_WORD, 0, 0, NULL, NULL },
{ "XChange", 14, FID_XChange, FDF_WORD|FDF_RANGE, -1000, +1000, NULL, NULL },
{ "YChange", 16, FID_YChange, FDF_WORD|FDF_RANGE, -1000, +1000, NULL, NULL },
{ "ZChange", 18, FID_ZChange, FDF_WORD|FDF_RANGE, -1000, +1000, NULL, NULL },
{ "Buttons", 20, FID_Buttons, FDF_LONG, 0, 0, NULL, NULL },
{ "ButtonTimeOut", 24, FID_ButtonTimeOut, FDF_WORD|FDF_RANGE, 0, 32000, NULL, NULL },
{ "MoveTimeOut", 26, FID_MoveTimeOut, FDF_WORD|FDF_RANGE, 0, 32000, NULL, NULL },
{ "NXLimit", 28, FID_NXLimit, FDF_WORD, 0, 0, NULL, NULL },
{ "NYLimit", 30, FID_NYLimit, FDF_WORD, 0, 0, NULL, NULL },
{ "PXLimit", 32, FID_PXLimit, FDF_WORD, 0, 0, NULL, NULL },
{ "PYLimit", 34, FID_PYLimit, FDF_WORD, 0, 0, NULL, NULL },
};
BYTE ModAuthor[] = "Paul Manias";
BYTE ModDate[] = "September 1998";
BYTE ModCopyright[] = "DreamWorld Productions (c) 1996-1998. All rights reserved.";
BYTE ModName[] = "Joyports";
/************************************************************************************
** Command: Init()
** Short: Called when our module is being opened for the first time. Any
** allocations made here will need to be freed in the FreeModule()
** function.
*/
LIBFUNC LONG CMDInit(mreg(__a0) LONG argModule,
mreg(__a1) LONG argDPKBase,
mreg(__a2) LONG argGVBase,
mreg(__d0) LONG argDPKVersion,
mreg(__d1) LONG argDPKRevision)
{
DPKBase = (APTR)argDPKBase;
GVBase = (struct GVBase *)argGVBase;
Public = ((struct Module *)argModule)->Public;
if ((argDPKVersion < DPKVersion) OR
((argDPKVersion IS DPKVersion) AND (argDPKRevision < DPKRevision))) {
DPrintF("!Init:","This module requires a newer version of the dpkernel library.");
return(ERR_FAILED);
}
if (!(JoyObject = AddSysObjectTags(ID_JOYDATA, ID_JOYDATA, "JoyData",
TAGS, NULL,
SOA_Activate, JOY_Activate,
SOA_Free, JOY_Free,
SOA_Get, JOY_Get,
SOA_Init, JOY_Init,
SOA_Query, JOY_Activate,
SOA_FieldArray, &JoyFields,
SOA_FieldTotal, JOY_FIELDS,
SOA_FieldSize, sizeof(struct Field),
TAGEND))) {
FreeModule();
return(ERR_FAILED);
}
return(ERR_OK);
}
/************************************************************************************
** Command: Open()
** Short: Called when our module is being opened for a second time...
*/
LIBFUNC LONG CMDOpen(mreg(__a0) struct Module *Module)
{
Public->OpenCount++;
return(ERR_OK);
}
/************************************************************************************
** Command: Expunge()
** Short: Called on expunge - if no program has us opened then we can give
** permission to have us shut down.
*/
LIBFUNC LONG CMDExpunge(void)
{
if (Public) {
if (Public->OpenCount IS NULL) {
FreeModule();
return(ERR_OK); /* Okay to expunge */
}
}
else DPrintF("!Joyports:","I have no Public base reference.");
return(ERR_FAILED); /* Do not expunge */
}
/************************************************************************************
** Command: Close()
** Short: Called whenever someone is closing a link to our module.
*/
LIBFUNC void CMDClose(mreg(__a0) struct Module *Module)
{
Public->OpenCount--;
}
/************************************************************************************
** Internal: FreeModule()
** Short: Frees any allocations made in the initialisation of our module.
*/
void FreeModule(void)
{
if (JoyObject) RemSysObject(JoyObject);
}
#include "JOY_Init.c"